12. 构造函数
声明构造函数
Python 和 C++ 都有构造函数。构造函数定义了对象实例化时会发生什么。
Python 构造函数
它们定义了对象实例化时会发生什么。在 Python 中,语法是:
def __init__(self, variable1, variable2, ..., variablen):
self.variable1 = variable1
self.variable2 = variable2
self.variablen = variablen
C++ 构造函数声明
在 C++ 中,构造函数声明如下:
Classname (datatype for variable1, datatype for variable2, …, datatype for variablen);
你也可以同时声明一个默认的构造函数。
Classname ();
实例化一个对象而不提供变量的值时,使用这个默认的构造函数。说得更具体一点,你将用一个二维向量来初始化一个矩阵变量。如果不提供二维向量,也可以使用默认向量来初始化矩阵变量。第二种情况中,可以使用空构造函数。
Gaussian 构造函数声明如下:
class Gaussian
{
private:
...
public:
...
Gaussian ();
Gaussian (float, float);
....
};
定义构造函数
声明了构造函数后,你需要在 .cpp 文件中实际定义它们。
构造函数定义的语法如下:
//空构造函数的语法
Classname::ClassName() {
constructor function definition
}
// constructor function syntax
Classname::ClassName(datatype variable1, datatype variable2, …, datatype variablen) {
constructor function definition
}
你可以看到这在 Gaussian 类中是如何实现的:
Gaussian::Gaussian() {
mu = 0;
sigma2 = 1;
}
Gaussian::Gaussian (float average, float sigma) {
mu = average;
sigma2 = sigma;
}
请注意,构造函数不返回任何内容。它们只会初始化类变量。你可能还想知道,如果 mu 和 sigma2 是私有变量,函数定义如何能访问这两个变量。请记住,私有变量可以从类代码内部访问,但不能从类外部访问。
使用默认值初始化
在 Python 和 C++ 中,都可以在构造函数中使用默认值。在 Python 中,语法是:
def __init__(self, variable1 = default1, variable2 = default2, ..., variablen = defaultn):
self.variable1 = variable1
self.variable2 = variable2
self.variablen = variablen
C++ 也有相同功能,但语法可能和所期望的不一样。默认值的定义实际上在 .h 文件函数定义中。下面一个加法类的简单例子,它包含两个整数并输出它们的总和。
以下为头文件 add.h:
class Add
{
public:
int a;
int b;
Add(int, int second = 17);
int addition();
};
这里是 add.cpp 中的定义:
# include "add.h"
Add::Add(int first, int second) {
a = first;
b = second;
}
int Add::addition() {
return a + b;
}
请注意,默认值是在头文件中声明的。现在,如果在实例化 add 对象时只指定了一个值,则变量 b 将具有默认值 17:
# include <iostream>
# include "add.h"
int main() {
Add adder(5);
std::cout << adder.addition() << std::endl;
return 0;
}
上述代码输出值 22。
声明并定义矩阵类构造函数
现在轮到你了。填充 matrix.h 文件和 matrix.cpp 文件中的 TODO 部分。
Start Quiz:
#include <iostream>
#include <vector>
#include "matrix.h"
int main () {
// TODO: Nothing to do here
return 0;
}
#include "matrix.h"
/* TODO: Define the default constructor. Remember the syntax is
** Classname::ClassName() {
**
** initialize variables
**
** }
**
**
** You need to initialize the grid variable to a default value such as
** a 4x4 matrix with all zeros.
**
** Then initialize the rows variable, and the cols variable using the
** vector size method. For example myvector.size() will give the size of
** a vector. For a 2-dimensional vector, myvector.size() would be the
** number of rows in a matrix.
**
*/
/* TODO: Define a constructor that receives a 2-Dimensional vector
** and assigns the vector to the grid variable.
**
** Remember the syntax is
** Classname::ClassName(datatype inputvariablename) {
**
** classvariable = inputvariablename
**
** }
**
** Then initialize the rows variable, and the cols variable exactly
** as you did for the default constructor.
**
*/
#include <vector>
class Matrix
{
private:
std::vector< std::vector<float> > grid;
std::vector<float>::size_type rows;
std::vector<float>::size_type cols;
public:
/*
** TODO: Declare constructor functions
** For the matrix class, you will need two constructor functions.
** 1. An empty constructor function
** 2. A constructor function that accepts a 2-dimensional vector
*/
};
matrix.h 参考答案
# include <vector>
class Matrix
{
private:
std::vector< std::vector<float> > grid;
std::vector<int>::size_type rows;
std::vector<int>::size_type cols;
public:
// 构造函数声明
Matrix ();
Matrix (std::vector< std::vector<float> >);
};
matrix.cpp 参考答案
# include "matrix.h"
Matrix::Matrix() {
std::vector <std:: vector <float> > initial_grid (10, std::vector <float>(5, 0.5));
grid = initial_grid;
rows = initial_grid.size();
cols = initial_grid[0].size();
}
Matrix::Matrix(std::vector <std:: vector <float> > initial_grid) {
grid = initial_grid;
rows = initial_grid.size();
cols = initial_grid[0].size();
}